跳到主要内容

缓存 Rive 文件

缓存 Rive 文件使你的应用能够重用已加载的 .riv 文件,而无需重复加载和解析。这可以在同一文件被多次渲染时提升性能。

示例用法

在 Android 中缓存 Rive 文件,可以使用 Rive File 类加载并缓存文件。该 RiveFile 可以在多个 RiveAnimationView 实例间重用:

import app.rive.runtime.kotlin.RiveAnimationView
import app.rive.runtime.kotlin.RiveInitializer
import app.rive.runtime.kotlin.core.File

class MainActivity : ComponentActivity() {
var riveFile: File? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()

// 初始化 Rive
AppInitializer.getInstance(applicationContext)
.initializeComponent(RiveInitializer::class.java)

// 从 assets 加载 Rive 文件并缓存
application.assets.open("rewards_demo.riv").use { inputStream ->
val fileBytes = inputStream.readBytes()
riveFile = File(fileBytes)
}

setContent {
Row {
// 第一次使用缓存文件
AndroidView(
modifier = Modifier.weight(1f),
factory = { context ->
RiveAnimationView(context).also {
it.setRiveFile(
file = riveFile!!,
stateMachineName = "State Machine 1",
autoBind = true,
)
}
}
)

// 第二次使用缓存文件
AndroidView(
modifier = Modifier.weight(1f),
factory = { context ->
RiveAnimationView(context).also {
it.setRiveFile(
file = riveFile!!,
stateMachineName = "State Machine 1",
autoBind = true,
)
}
}
)
}
}
}

override fun onDestroy() {
riveFile?.release()
super.onDestroy()
}
}

请注意,这仅是加载字节的一种方式,你的实现可能因应用架构而异。关键是从字节数组创建 Rive File,然后将其设置到 RiveAnimationView 上。

⚠️ Rive File 使用引用计数,创建时引用计数为 1。将其分配给 RiveAnimationView 会保留一个额外引用,但仍有创建时的原始引用。你负责在不再需要文件时通过调用 File::release 释放该引用。如果不释放文件,即使 Kotlin 对象被垃圾回收,原生内存仍将保留直到应用关闭。